/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package dao;

import beans.Barrio;
import beans.Bebida;
import beans.Boliche;
import beans.DiaSalida;
import beans.MedioComunicacion;
import beans.Musica;
import beans.Profesion;
import beans.Socio;
import beans.Visita;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
 *
 * @author nMoncho
 */
public class SocioMerger {

    private static Map<String, Barrio> barrioCache = new HashMap<String, Barrio>();
    private static Map<String, Boliche> bolicheCache = new HashMap<String, Boliche>();
    private static Map<String, Profesion> profesionCache = new HashMap<String, Profesion>();
    private static Map<String, Musica> musicaCache = new HashMap<String, Musica>();
    private static Map<String, Bebida> bebidaCache = new HashMap<String, Bebida>();
    private static Map<String, DiaSalida> diasCache = new HashMap<String, DiaSalida>();
    private static Map<String, MedioComunicacion> mediosCache = new HashMap<String, MedioComunicacion>();

    public static void merge(List<Socio> socios){
        for(Socio socio : socios){
            //Merge Barrio
            Barrio barrio = barrioCache.get(socio.getBarrio().getNombre());
            if(barrio == null)
                barrioCache.put(socio.getBarrio().getNombre(), socio.getBarrio());
            else
                socio.setBarrio(barrio);

            //Merge Boliche
            Boliche boliche = bolicheCache.get(socio.getBoliche().getNombre());
            if(boliche == null)
                bolicheCache.put(socio.getBoliche().getNombre(), socio.getBoliche());
            else
                socio.setBoliche(boliche);

            //Merge Boliche de Visita
            /*for(Visita visita : socio.getVisitas()){
                boliche = null;
                boliche = bolicheCache.get(visita.getBoliche().getNombre());
                if(boliche == null)
                    bolicheCache.put(visita.getBoliche().getNombre(), visita.getBoliche());
                else
                    visita.setBoliche(boliche);
            }*/

            //Merge Profesion
            Profesion profesion = profesionCache.get(socio.getEstudio().getNombre());
            if(profesion == null)
                profesionCache.put(socio.getEstudio().getNombre(), socio.getEstudio());
            else
                socio.setEstudio(profesion);

            //Merge Musica
            Musica musica = null;
            Musica musc1 = null;
            Iterator<Musica> itMus = socio.getPreferenciaMusica().iterator();
            List<Musica> musTemp = new LinkedList<Musica>();
            while(itMus.hasNext()){
                musc1 = itMus.next();
                musica = musicaCache.get(musc1.getNombre());
                if(musica == null)
                    musicaCache.put(musc1.getNombre(), musc1);
                else{
                    itMus.remove();
                    musTemp.add(musica);
                }
            }
            socio.getPreferenciaMusica().addAll(musTemp);

            //Merge Bebida
            Bebida bebida = null;
            Bebida beb1 = null;
            Iterator<Bebida> itBeb = socio.getPreferenciaBebida().iterator();
            List<Bebida> bebTemp = new LinkedList<Bebida>();
            while(itBeb.hasNext()){
                beb1 = itBeb.next();
                bebida = bebidaCache.get(beb1.getNombre());
                if(bebida == null)
                    bebidaCache.put(beb1.getNombre(), beb1);
                else{
                    itBeb.remove();
                    bebTemp.add(bebida);
                }
            }
            socio.getPreferenciaBebida().addAll(bebTemp);

            //Merge DiaSalida
            DiaSalida diaSalida = null;
            DiaSalida diaS1 = null;
            Iterator<DiaSalida> itDia = socio.getPreferenciaDias().iterator();
            List<DiaSalida> diaTemp = new LinkedList<DiaSalida>();
            while(itDia.hasNext()){
                diaS1 = itDia.next();
                diaSalida = diasCache.get(diaS1.getNombre());
                if(diaSalida == null)
                    diasCache.put(diaS1.getNombre(), diaS1);
                else{
                    itDia.remove();
                    diaTemp.add(diaSalida);
                }
            }
            socio.getPreferenciaDias().addAll(diaTemp);

            //Merge MedioComunicacion
            MedioComunicacion medio = null;
            MedioComunicacion med1 = null;
            Iterator<MedioComunicacion> itMed = socio.getPreferenciaComunicacion().iterator();
            List<MedioComunicacion> medTemp = new LinkedList<MedioComunicacion>();
            while(itMed.hasNext()){
                med1 = itMed.next();
                medio = mediosCache.get(med1.getNombre());
                if(medio == null)
                    mediosCache.put(med1.getNombre(), med1);
                else{
                    itMed.remove();
                    medTemp.add(medio);
                }
            }
            socio.getPreferenciaComunicacion().addAll(medTemp);
        }
    }
}
